package br.com.prezz.server;

import java.util.ArrayList;
import java.util.List;


import javax.jdo.PersistenceManager;
import javax.jdo.Query;



import br.com.prezz.client.ItemLista;

import br.com.prezz.client.ListaException;
import br.com.prezz.client.ListaSalvarService;
import br.com.prezz.client.ListaService;
import br.com.prezz.client.ListaString;
import br.com.prezz.client.LoginInfo;
import br.com.prezz.client.Produto;

import com.google.gwt.core.client.GWT;
import com.google.gwt.user.server.rpc.RemoteServiceServlet;

public class ListaServiceImpl extends RemoteServiceServlet implements ListaService,ListaSalvarService{
	
	/**
	 * Quantidade de produtos na pesquisa autosugest
	 */
	int qtdprodutolista=5;
	@Override
	public String pegarproduto(String nome) {
		String saida="";
		System.out.println("Pegando Produto");
		PersistenceManager pm=Pmf.get().getPersistenceManager();
		String query="select from "+Produto.class.getName()+" ";
		   
		try{
			   Query qry=pm.newQuery(query);
			   //qry.setFilter(" nome=='arroz'");
			  
			@SuppressWarnings("unchecked")
			List<Produto> lstProdutos=(List<Produto>)qry.execute();
			   System.out.println("Tamanho:"+lstProdutos.size());
			   
			   if(lstProdutos.isEmpty()){
				   GWT.log("Lista Vazia:"+lstProdutos.size());
				   //response.getWriter().println("<p>Lista nao encontradda</p>");
  
			   }else{
				   GWT.log("Lista Quantidade:"+lstProdutos.size());
				   for(Produto prod:lstProdutos){
					   if(prod!=null){
						   if(prod.getNome()!=null){
							   saida+=prod.getNome()+";";
						   }
					   }
				   }
			   }
		   }
		   catch(Exception e){
			   e.printStackTrace();
		   }
		   
		saida+="teste;";
		return saida;
	}

	@Override
	public String salvarLista(String nome_lista, List<ItemLista> items,
			LoginInfo login) throws IllegalArgumentException {
	
	
		GWT.log("Dados chegou aqui do "+login.getNickname());
		return "sdsd";
	}

	@Override
	public String salvarListaSt(String nome, String campos, String usuario)
			throws  ListaException {
		
		throw new ListaException("-");
	}
	/**
	 * Desativado por teste
	 */
	/*
	@Override
	public String salvarLista(String carga, String usuario) {
		System.out.println(">-*-*"+usuario+"*-*-<");
		System.out.println(carga);
		List<ItemLista> produtos=new ArrayList<ItemLista>();
		String[] campos=carga.split("\\|");
		
		
		for(String campo:campos){
			if(!campo.isEmpty()){
				String[] arrcampo = campo.split("\\:");
				GWT.log("Produto:"+arrcampo[0]);
				produtos.add(new ItemLista(arrcampo[0],Integer.parseInt(arrcampo[1])));

			}
		}
		
		
		
		PersistenceManager pm=Pmf.get().getPersistenceManager();
		try{
			
		   	   Lista lista=new Lista(usuario,usuario,produtos);
		   	   GWT.log("Inserido");
		   	   pm.makePersistent(lista);
		}catch(Exception e){   
			System.out.println("Erro"+e.getMessage());
		
			e.printStackTrace();
		}finally{
			pm.close();
		}
		return null;
	}
	*/
	/**
	 * Salva uma Lista 
	 * 
	 */
	@Override
	public String salvarLista(String nomelista,String carga, String usuario) {
		PersistenceManager pm=Pmf.get().getPersistenceManager();
		try{
			   ListaString lista=new ListaString(nomelista,carga,usuario);
		   	   GWT.log("Inserido");
		   	   pm.makePersistent(lista);
		}catch(Exception e){   
			System.out.println("Erro"+e.getMessage());
			e.printStackTrace();
		}finally{
			pm.close();
		}
		return null;
	}
/**
 * Retorna array com nome lista salvas pelo usuario
 * @param usuarioemail
 * @return
 */
	@Override
	public String getListas(String usuarioemail){
		PersistenceManager pm=Pmf.get().getPersistenceManager();
		String query="select from "+ListaString.class.getName()+" ";
		List<ListaString> lstProdutos=null;
		try{
			Query qry=pm.newQuery(query);
            //Query qry=pm.newQuery(ListaString.class,"usuarioemail=='"+usuarioemail+"'");
           qry.setFilter ( "usuarioemail ==  email" );
           qry.declareParameters("String email");
			@SuppressWarnings("unchecked")
			List<ListaString> lista=(List<ListaString>)qry.execute(usuarioemail);
			System.out.print("Retornando lista");
			GWT.log("Servidor:Lista de produtos enviados");
			lstProdutos=lista;
			//lstProdutos=lstProdutos1.toString();
		}catch(Exception e){
			e.printStackTrace();
		}
		return lstProdutos.toString();
	}
	
/**
 * Retorna lista de produtos
 * @param usuarioemail email do usuario
 * @param nomelista nome da lista para consulta
 */
public String getProdutosLista(String usuarioemail, String nomelista)
		throws IllegalArgumentException {
	// TODO Retorna o lista com usuario
	
	return null;
}
/**
 * Retorna lista de produtos com apartir do nome
 */
@Override
public String pegaProduto(String nome) throws IllegalArgumentException {

	if(nome.length()<4){
		return null;
	}
	PersistenceManager pm=Pmf.get().getPersistenceManager();
	String query="select from "+Produto.class.getName()+" ";
	List<Produto> lstProdutos=null;
	String saida="";
	try{
		Query qry=pm.newQuery(query);
		@SuppressWarnings("unchecked")
		List<Produto> lista=(List<Produto>)qry.execute(nome);
		/*
		 *
		 
		if(tablescan(nome,lista).size()>5){
			lstProdutos=tablescan(nome,lista).subList(0, 5);
		}
		if(lstProdutos==null){
			return null;
		}
		*/
		lstProdutos=tablescan(nome,lista);
		GWT.log("Produto Quantidade:"+lstProdutos.size());
		   for(Produto prod:lstProdutos){;
			   if(prod!=null){
				   if(prod.getNome()!=null){
					   saida+=prod.getNome()+";";
				   }
			   }
		   }
		//lstProdutos=lstProdutos1.toString();
	}catch(Exception e){
		e.printStackTrace();
	}
	return saida;
	
	
}
	
/**
 * REtorna de uma lista lista com produtos com o nome
 * @param x
 * @param produtolist
 * @return
 */
	List<Produto> tablescan(String x,List<Produto> produtolist){
	int qtdencontrada=0;			
	List<Produto> listasaida=new ArrayList<Produto>();
		for(Produto produto:produtolist){
			if(produto.getNome()!=null){
				String nomeproduto=produto.getNome();
				if(nomeproduto.startsWith(x.toUpperCase())){
					produto.setNome(produto.getNome()+"-*-");
					listasaida.add(produto);
					qtdencontrada++;
					
					if(qtdencontrada>=5) return listasaida;
				}
			}
		}

		for(Produto produto:produtolist){
			if(produto.getNome()!=null){
				String nomeproduto=produto.getNome();
				if(nomeproduto.matches(".*"+x.toUpperCase()+".*")){
					if(!nomeproduto.startsWith(x.toUpperCase())){
						listasaida.add(produto);
						qtdencontrada++;
						if(qtdencontrada>=5) return listasaida;
					}
				}
			}
		}
		return listasaida;
	}
}
